<!DOCTYPE html>
<html>
  	<head>
	    <title>哈泊客户关系管理系统讲解</title>
	    <meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		<link rel="stylesheet" type="text/css" href="/layui/css/layui.css"/>
		<style type="text/css">
			::-webkit-scrollbar {width:0px;}
			body {margin:0px;background-color:#e0e0e0;font:14px Helvetica Neue,Helvetica,PingFang SC,\5FAE\8F6F\96C5\9ED1,Tahoma,Arial,sans-serif;}
			ul {list-style:none;margin:0px;padding:0px;}
			.p1 {line-height:26px;}
			.p2 {display:inline-block;width:34px;}
			.BOX {background-color:#fff;width:900px;height:700px;margin:20px auto;position:relative;}
			.pptMenu {width:159px;border-right:1px solid #e0e0e0;height:660px;padding:20px;float:left;overflow:auto;}
			.pptMenu li {display:inline-block;height:98px;width:137px;margin-bottom:10px;border:1px solid #d0d0d0; cursor:pointer;color:#666;padding:10px;}
			.pptMenu li.lh118 {line-height:98px;}
			.pptMenu li .f2 {font-size:12px;margin:5px 0px 0px 22px;line-height:20px;color:#999;}
			.pptMenu li.on {border:1px solid #f26828;}
			
			.pptContent {padding:60px 20px 20px 20px;width:660px;height:620px;float:left;overflow:auto;}
			.pptContent .item {width:660px;height:620px;position:relative;display:none;font-size:16px;overflow:auto;}
			.pptContent .item .code {background-color:#e5e5e5;border-left:5px solid #bbb;padding:10px;font-family:Verdana;}
			.pptContent .item img {max-width:660px;}
		</style>
		<script src="/js/jquery-1.8.2.min.js"></script>
		<script type="text/javascript">
			$(function(){
				
				$('body').keyup(function(){
					if(event.keyCode==37){
						//右箭头
						var index = $('.pptMenu li').index($('.pptMenu li.on'));
						if(index!=0){
							$($('.pptMenu li')[index-1]).click();
						}
					}else if(event.keyCode==39){
						//左箭头
						var index = $('.pptMenu li').index($('.pptMenu li.on'));
						if(index!=$('.pptMenu li').length-1){
							$($('.pptMenu li')[index+1]).click();
						}
					}
				});
				
				$('.pptMenu li').click(function(){
					var index = $('.pptMenu li').index($(this));
					$('.pptMenu li').removeClass('on');
					$(this).addClass('on');
					$('.pptContent .item').hide().eq(index).show();
				});
				
			});
		</script>
  	</head>
  
  	<body>
    	
        <div class="BOX">
			<div style="border-bottom:1px solid #e0e0e0;position:absolute;right:0px;width:680px;text-align:right;padding:10px;"><img src="/images/logo.png" style="max-height:38px;opacity:0.4;filter:alpha(opacity=40);"/></div>
        	
            <div class="pptMenu">
            	<ul>
                	<li class="lh118 on" style="text-align:center;"><span>权限管理系统</span></li>
                    <li>为什么要做权限管理控制？<div class="f2">权限管理是Web应用项目中比较关键的环节，......</div></li>
                    <li>1、权限设计概述<div class="f2">随着Web 服务的复杂度增加以及用户数量和种类的增多，......</div></li>
					<li>2、基于角色的权限管理设计（Role-Based Access  Control ,RBAC）<div style="color:#999;">2.1权限管理用例图</div></li>
					<li>2、基于角色的权限管理设计（RBAC）<div style="color:#999;">2.1权限管理用例图<br/>普通管理员、普通用户</div></li>
					<li>2、基于角色的权限管理设计（RBAC）<div style="color:#999;">2.2用例图描述</div><div class="f2">超级管理员、普通管理员、......</div></li>
					<li>3、权限设计思路<div style="color:#999;">3.1、基于角色的访问控制RBAC<br/>3.2、用户<br/>3.3、角色</div></li>
					<li>3、权限设计思路<div style="color:#999;">3.4、权限<br/>3.5、用户与角色的关系<br/>3.6、权限与角色......</div></li>
					<li>4. 权限的具体实现模式<div style="color:#999;">4.1 数据库结构<br/>模式一：用户->角色->权限（最通用......</div></li>
					<li>4. 权限的具体实现模式<div style="color:#999;">4.1 数据库结构<br/>角色表</div></li>
					<li>4. 权限的具体实现模式<div style="color:#999;">4.1 数据库结构<br/>权限（菜单）表</div></li>
					<li>4. 权限的具体实现模式<div style="color:#999;">4.1 数据库结构<br/>角色权限关联表</div></li>
					<li>5. 业务实现<div style="color:#999;">5.1 开发管理系统</div></li>
					<li>5. 业务实现<div style="color:#999;">5.2 DBUtil.insert()</div></li>
					<li>5. 业务实现<div style="color:#999;">5.2 DBUtil.selectTo<br/>JsonArray()</div></li>
					<li>5. 业务实现<div style="color:#999;">5.2 DBUtil.search()</div></li>
                </ul>
            </div>
            
            <div class="pptContent">
            
            	<div class="item" style="display:block;">
					<!--<div><img src="http://zejunwu0.java.cdnjsp.org/images/logo.png" style="max-height:42px;"/></div>-->
                	<h1 style="text-align:center;font-size:58px;margin:0px;padding-top:180px;color:#f26828;">权限管理系统<br/>设计讲解</h1>
                    <div style="position:absolute;bottom:120px;right:125px;font-size:24px;">吴泽军</div>
                    <div style="position:absolute;bottom:80px;right:100px;font-size:24px;">2017-06-08</div>
                </div>
                
                <div class="item">
                	<div style="cursor:pointer;font-size:24px;" onclick="$('#d-1-0').fadeIn();"><b>为什么要做权限管理控制？</b></div>
					<div id="d-1-0" style="padding-top:10px;line-height:26px;display:none;font-size:18px;">
						<span class="p2"></span>权限管理是Web应用项目中比较关键的环节，因为浏览器是每一台计算机都已具备的，如果不建立权限管理系统，那么一个“非法用户”可以轻而易举通过浏览器访问Web应用项目中的所有功能。因此需要权限管理系统进行权限检测，让经过授权的用户可以正常合法的使用已授权的功能，而对那些未授权的非法用户拒之门外。
					</div>
                </div>
                
                <div class="item">
                	<div class="p1"><span class="p2"></span>随着Web 服务的复杂度增加以及用户数量和种类的增多，安全问题在理论及工程上都是一个必须考虑的问题，而权限管理是安全问题中一个很重要的方面。</div>
                    <p>权限可简单表述为这样的逻辑表达式：</p>
					<p class="code" style="margin-left:34px;">判断<strong style="color:#f60;">“Who对What(Which)进行How的操作”</strong>的逻辑表达式是否为真。</p>
					<div style="padding-top:10px;"><b>意义</b></div>
					<div style="padding-top:10px;padding-left:20px;line-height:26px;">
						 用户管理及权限管理一直是应用系统中不可缺少的一个部分<br/>
						 系统用户很多，系统功能也很多<br/>
						 不同用户对系统功能的需求不同<br/>
						 出于安全等考虑，关键的、重要的系统功能需限制部分用户的使用<br/>
						 出于方便性考虑，系统功能需要根据不同的用户而定制
					</div>
                </div>
				
				<div class="item">
                	<div style="padding-top:10px;padding-bottom:100px;"><b>2.1、权限管理用例图</b></div>
					<div><img src="images/1.png"/></div>
                </div>
				
				<div class="item">
					<div><img src="images/2.png"/></div>
					<div style="padding-top:100px;"><img src="images/3.png"/></div>
                </div>
				
				<div class="item">
					<div style="padding-top:10px;padding-bottom:30px;"><b>2.2、用例图描述</b></div>
					<div class="p1"><span class="p2"></span><b style="color:#000;">超级管理员：</b>系统中默认的角色，它是系统中拥有最高权限的角色，它不仅能够管理其他的管理员和用户，而且还可以对系统中每个模块的任一功能进行操作、维护。</div>
					<div class="p1" style="padding-top:20px;"><span class="p2"></span><b style="color:#000;">普通管理员：</b>它是由超级管理员创建的，并授予权限，它能够管理系统中大部分的功能，它可以查看所有普通管理员、普通用户的信息，它只能对由它自己创建的用户进行编辑、删除操作，和管理拥有权限的模块。</div>
					<div class="p1" style="padding-top:20px;"><span class="p2"></span><b style="color:#000;">普通用户：</b>它是系统中最低权限的角色，它只能对自己拥有的权限进行操作，一般情况下，它的权限是对信息的浏览和对自己信息的录入，修改。</div>
					<div class="p1" style="padding-top:20px;"><span class="p2"></span><b style="color:#000;">登陆系统：</b>根据用户拥有的权限不同，用户所能操作的功能多少就不同，所以在登陆系统的时候就要对用户的权限进行判断。</div>
					<div class="p1" style="padding-top:20px;"><span class="p2"></span><b style="color:#000;">用户管理：</b>这里对本系统的登录用户进行维护。包括，新建、删除、编辑、注销等；系统初始化的时候，用户管理中默认只有一个拥有超级管理员角色的用户，因此在初始化登陆的时候，只能用这个用户登陆，其他的用户由这个用户创建并授予角色。</div>
					<div class="p1" style="padding-top:20px;"><span class="p2"></span><b style="color:#000;">角色管理：</b>角色是赋予系统用户的职权名称。包括，新建、删除、编辑、注销等；系统初始化的时候，角色管理中默认只拥有一个超级管理员的角色，其他角色由拥有这个角色的用户创建并授权。</div>
					<div class="p1" style="padding-top:20px;"><span class="p2"></span><b style="color:#000;">其他模块：</b>其他模块的每个功能都拥有一个唯一Id，根据用户登陆的权限，再确定这些功能是否对用户开放。</div>
				</div>
				
				<div class="item">
					<div style="padding-top:10px;padding-bottom:20px;"><b>3.1 基于角色的访问控制RBAC</b></div>
					<div class="p1"><span class="p2"></span>RBAC 的主要思想是:权限（Permissions）是和角色（Roles）相联系的，而用户（Users）则被指定到相应的角色作为其成员。这样就使权限的管理大大简化了。 </div>
					<div class="p1"><span class="p2"></span>系统的权限控制主要是采用基于角色的访问控制，把权限绑定到角色上，当用户要操作权限时，就把角色赋给用户。而且在需要撤回权限时，只需把角色上的权限撤回就行了。</div>
					<div style="padding-top:10px;padding-bottom:20px;"><b>3.2 用户</b></div>
					<div class="p1"><span class="p2"></span>用户仅仅是纯粹的用户，用来记录用户相关信息，如用户名、密码等，权限是被分离出去了的。用户（User）要拥有对某种资源的权限，必须通过角色（Role）去关联。用户通常具有以下属性：</div>
					<div class="p1 code" style="margin-left:50px;">编号，在系统中唯一。<br/>名称，在系统中唯一。</div>
					<div style="padding-top:10px;padding-bottom:20px;"><b>3.3 角色</b></div>
					<div class="p1"><span class="p2"></span>角色是使用权限的基本单位，拥有一定数量的权限，通过角色赋予用户权限，通常具有以下属性：</div>
					<div class="p1 code" style="margin-left:50px;">编号，在系统中唯一。<br/>名称，在系统中唯一</div>
				</div>
				
				<div class="item">
					<div style="padding-top:10px;padding-bottom:20px;"><b>3.4 权限</b></div>
					<div class="p1"><span class="p2"></span>权限指用户根据角色获得对程序某些功能的操作，例如对文件的读、写、修改和删除功能，通常具有以下属性： </div>
					<div class="p1 code" style="margin-left:50px;">编号，在系统中唯一。</div>
					<div style="padding-top:10px;padding-bottom:20px;"><b>3.5 用户与角色的关系</b></div>
					<div class="p1"><span class="p2"></span>一个用户（User）对应一个角色（Role），一个角色可以被多个用户使用，用户角色就是用来描述他们之间隶属关系的对象。用户（User）通过角色（Role）关联所拥有对某种资源的权限。</div>
					<div style="padding-top:10px;padding-bottom:20px;"><b>3.6 权限与角色的关系</b></div>
					<div class="p1"><span class="p2"></span>一个角色（Role）可以拥有多个权限，同样一个权限可分配给多个角色。</div>
					<div style="padding-top:10px;padding-bottom:20px;"><b>3.7 建立用户权限</b></div>
					<div class="p1"><span class="p2"></span>用户权限系统的核心由以下三部分构成：创造权限、分配权限和使用权限。</div>
					<div class="p1 code" style="margin-left:36px;margin-top:20px;">第一步、创造权限。<br/>第二步、由系统管理员（Administrator）创建用户和角色，并且指定用户角色（User－Role）和角色权限的关联关系。 <br/>第三步、用户（User）登陆系统，对自己拥有的权限进行管理、使用。</div>
				</div>
				
				<div class="item">
					<div style="padding-top:10px;padding-bottom:20px;"><b>4.1 数据库结构</b></div>
					<div class="code" style="margin-bottom:10px;">模式一：用户->角色->权限（最通用的方法）</div>
					<div>用户表（sys_users）</div>
					<table class="layui-table" id="tableList">
						<colgroup>
							<col width="120">
							<col width="100">
							<col width="100">
							<col width="100">
							<col>
						</colgroup>
						<thead>
							<tr>
								<th>字段名称</th>
								<th>字段类型</th>
								<th>字段长度</th>
								<th>是否为空</th>
								<th>字段说明</th>
							</tr> 
						</thead>
						<tbody>
							<tr><td>userId</td><td>bigint</td><td>20</td><td>否</td><td>用户ID、主键，自增长</td></tr>
							<tr><td>userName</td><td>varchar</td><td>20</td><td>否</td><td>账号，唯一</td></tr>
							<tr><td>password</td><td>varchar</td><td>32</td><td>否</td><td>密码</td></tr>
							<tr><td>realName</td><td>varchar</td><td>20</td><td>否</td><td>姓名</td></tr>
							<tr><td>status</td><td>int</td><td>11</td><td>否</td><td>状态，-1|删除，0|禁用， 1|正常</td></tr>
							<tr><td>email</td><td>varchar</td><td>30</td><td></td><td>邮箱</td></tr>
							<tr><td>mobile</td><td>varchar</td><td>11</td><td></td><td>手机号码</td></tr>
							<tr><td>role</td><td>bigint</td><td>20</td><td>否</td><td>角色ID，sys_role.roleId</td></tr>
							<tr><td>createTime</td><td>datetime</td><td></td><td>否</td><td>创建时间</td></tr>
							<tr><td>createUser</td><td>bigint</td><td>20</td><td>否</td><td>创建用户</td></tr>
							<tr><td>updateTime</td><td>datetime</td><td></td><td>否</td><td>更新时间</td></tr>
							<tr><td>updateUser</td><td>bigint</td><td>20</td><td>否</td><td>更新用户</td></tr>
						</tbody>
					</table>
				</div>
				
				<div class="item">
					<div style="padding-top:10px;padding-bottom:20px;"><b>4.1 数据库结构</b></div>
					<div>角色表（sys_role）</div>
					<table class="layui-table" id="tableList">
						<colgroup>
							<col width="120">
							<col width="100">
							<col width="100">
							<col width="100">
							<col>
						</colgroup>
						<thead>
							<tr>
								<th>字段名称</th>
								<th>字段类型</th>
								<th>字段长度</th>
								<th>是否为空</th>
								<th>字段说明</th>
							</tr> 
						</thead>
						<tbody>
							<tr><td>roleId</td><td>bigint</td><td>20</td><td>否</td><td>角色ID、主键，自增长</td></tr>
							<tr><td>roleName</td><td>varchar</td><td>255</td><td>否</td><td>角色名称</td></tr>
							<tr><td>status</td><td>int</td><td>11</td><td>否</td><td>状态，-1|删除，0|禁用， 1|正常</td></tr>
							<tr><td>createTime</td><td>datetime</td><td></td><td>否</td><td>创建时间</td></tr>
							<tr><td>createUser</td><td>bigint</td><td>20</td><td>否</td><td>创建用户</td></tr>
							<tr><td>updateTime</td><td>datetime</td><td></td><td>否</td><td>更新时间</td></tr>
							<tr><td>updateUser</td><td>bigint</td><td>20</td><td>否</td><td>更新用户</td></tr>
						</tbody>
					</table>
				</div>
				
				<div class="item">
					<div style="padding-top:10px;padding-bottom:20px;"><b>4.1 数据库结构</b></div>
					<div>权限（菜单）表（sys_menu）</div>
					<table class="layui-table" id="tableList">
						<colgroup>
							<col width="120">
							<col width="100">
							<col width="100">
							<col width="100">
							<col>
						</colgroup>
						<thead>
							<tr>
								<th>字段名称</th>
								<th>字段类型</th>
								<th>字段长度</th>
								<th>是否为空</th>
								<th>字段说明</th>
							</tr> 
						</thead>
						<tbody>
							<tr><td>menuId</td><td>bigint</td><td>20</td><td>否</td><td>菜单ID、主键，自增长</td></tr>
							<tr><td>menuCode</td><td>varchar</td><td>20</td><td>否</td><td>菜单编码，用于做多级菜单</td></tr>
							<tr><td>menuName</td><td>varchar</td><td>20</td><td>否</td><td>菜单名称</td></tr>
							<tr><td>url</td><td>varchar</td><td>255</td><td></td><td>菜单资源地址</td></tr>
							<tr><td>parameter</td><td>varchar</td><td>255</td><td></td><td>菜单资源地址参数</td></tr>
							<tr><td>target</td><td>varchar</td><td>20</td><td></td><td>打开方式</td></tr>
							<tr><td>orderNum</td><td>int</td><td>11</td><td>否</td><td>排列系数</td></tr>
							<tr><td>status</td><td>int</td><td>11</td><td>否</td><td>状态，-1|删除，0|禁用， 1|正常</td></tr>
							<tr><td>createTime</td><td>datetime</td><td></td><td>否</td><td>创建时间</td></tr>
							<tr><td>createUser</td><td>bigint</td><td>20</td><td>否</td><td>创建用户</td></tr>
							<tr><td>updateTime</td><td>datetime</td><td></td><td>否</td><td>更新时间</td></tr>
							<tr><td>updateUser</td><td>bigint</td><td>20</td><td>否</td><td>更新用户</td></tr>
						</tbody>
					</table>
				</div>
				
				<div class="item">
					<div style="padding-top:10px;padding-bottom:20px;"><b>4.1 数据库结构</b></div>
					<div>角色权限（菜单）关联表（sys_sys_role_menu）</div>
					<table class="layui-table" id="tableList">
						<colgroup>
							<col width="120">
							<col width="100">
							<col width="100">
							<col width="100">
							<col>
						</colgroup>
						<thead>
							<tr>
								<th>字段名称</th>
								<th>字段类型</th>
								<th>字段长度</th>
								<th>是否为空</th>
								<th>字段说明</th>
							</tr> 
						</thead>
						<tbody>
							<tr><td>id</td><td>bigint</td><td>20</td><td>否</td><td>ID、主键，自增长</td></tr>
							<tr><td>roleId</td><td>bigint</td><td>20</td><td>否</td><td>角色ID，sys_role.roleId</td></tr>
							<tr><td>menuId</td><td>bigint</td><td>20</td><td>否</td><td>菜单ID，sys_menu.menuId</td></tr>
						</tbody>
					</table>
				</div>
				
				<div class="item">
					<div style="padding-top:10px;padding-bottom:20px;"><b>5.1 开发管理系</b></div>
					<div class="code">1、管理员<br/>2、系统权限（系统菜单）<br/>3、角色管理<br/>4、角色权限<br/><br/>5、session过滤器<br/>6、权限URi过滤器<br/>7、session监听器</div>
					<div class="code" style="margin-top:10px;">
						&lt;!-- session过滤器 --><br/>
						&lt;filter><br/>
							<span style="margin-right:24px;"></span>&lt;filter-name>SessionFilter&lt;/filter-name><br/>
							<span style="margin-right:24px;"></span>&lt;filter-class>com.mz.system.filter.SessionFilter&lt;/filter-class><br/>
						&lt;/filter><br/>
						&lt;filter-mapping><br/>
							<span style="margin-right:24px;"></span>&lt;filter-name>SessionFilter&lt;/filter-name><br/>
							<span style="margin-right:24px;"></span>&lt;url-pattern>/*&lt;/url-pattern><br/>
						&lt;/filter-mapping><br/>
					</div>
					<div class="code" style="margin-top:10px;">
						&lt;!-- session监听器 --><br/>
						&lt;listener><br/>
							<span style="margin-right:24px;"></span>&lt;listener-class>com.mz.system.listener.SessionListener&lt;/listener-class><br/>
						&lt;/listener>
					</div>
					<div class="code" style="margin-top:10px;">
						&lt;!-- session有效时长（单位：分钟） --><br/>
						&lt;session-config><br/>
							<span style="margin-right:24px;"></span>&lt;session-timeout>30&lt;/session-timeout><br/>
						&lt;/session-config>
					</div>
				</div>
				
				<div class="item">
					<div style="padding-top:10px;padding-bottom:10px;"><b>5.1 DBUtil.insert()</b></div>
					<div class="code" style="font-size:14px;height:600px;overflow:auto;line-height:24px;">
						public int insert(String table, String[] fields, Object[] values){<br/>
							<span style="margin-right:24px;"></span>Connection conn = this.getConnection();<br/>
							<span style="margin-right:24px;"></span>int resultNum = 0;<br/>
							<span style="margin-right:24px;"></span>StringBuffer sql = new StringBuffer("insert into ");<br/>
							<span style="margin-right:24px;"></span>sql.append(table);<br/>
							<span style="margin-right:24px;"></span>sql.append(" (" + StringUtils.join(fields, ", ") + ")");<br/>
							<span style="margin-right:24px;"></span>sql.append(" values (").append(getMark(values.length)).append(")");<br/>
							
							<span style="margin-right:24px;"></span>PreparedStatement pstmt = null;<br/>
							<span style="margin-right:24px;"></span>try {<br/>
								<span style="margin-right:48px;"></span>pstmt = (PreparedStatement) conn.prepareStatement(sql.toString());<br/>
								
								<span style="margin-right:48px;"></span>for(int i=0,len=values.length; i&lt;len; i++){<br/>
									<span style="margin-right:72px;"></span>Object o = values[i];<br/>
									<span style="margin-right:72px;"></span>if (o instanceof Integer) {<br/>
										<span style="margin-right:96px;"></span>pstmt.setInt(i+1, (int) o);<br/>
									<span style="margin-right:72px;"></span>}else if (o instanceof Double) {<br/>
										<span style="margin-right:96px;"></span>pstmt.setDouble(i+1, (double) o);<br/>
									<span style="margin-right:72px;"></span>}else if (o instanceof Long) {<br/>
										<span style="margin-right:96px;"></span>pstmt.setLong(i+1, (long) o);<br/>
									<span style="margin-right:72px;"></span>}else{<br/>
										<span style="margin-right:96px;"></span>pstmt.setString(i+1, o.toString());<br/>
									<span style="margin-right:72px;"></span>}<br/>
								<span style="margin-right:48px;"></span>}<br/>
								<span style="margin-right:48px;"></span>resultNum = pstmt.executeUpdate();<br/>
							<span style="margin-right:24px;"></span>} catch (SQLException e) {<br/>
								<span style="margin-right:48px;"></span>e.printStackTrace();<br/>
							<span style="margin-right:24px;"></span>} finally {<br/>
								<span style="margin-right:48px;"></span>try {<br/>
									<span style="margin-right:72px;"></span>if(pstmt!=null){<br/>
										<span style="margin-right:96px;"></span>pstmt.close();<br/>
									<span style="margin-right:72px;"></span>}<br/>
									<span style="margin-right:72px;"></span>if(conn!=null){<br/>
										<span style="margin-right:96px;"></span>conn.close();<br/>
									<span style="margin-right:72px;"></span>}<br/>
								<span style="margin-right:48px;"></span>} catch (SQLException e) {<br/>
									<span style="margin-right:96px;"></span>e.printStackTrace();<br/>
								<span style="margin-right:48px;"></span>}<br/>
							<span style="margin-right:24px;"></span>}<br/>
							<span style="margin-right:24px;"></span>return resultNum;<br/>
						}<br/>
					</div>
				</div>
				
				<div class="item">
					<div style="padding-top:10px;padding-bottom:10px;"><b>5.1 DBUtil.selectToJsonArray()</b></div>
					<div class="code" style="font-size:14px;height:600px;overflow:auto;line-height:24px;">
						public JSONArray selectToJsonArray(String sql, Integer rows){<br/>
							<span style="margin-right:24px;"></span>JSONArray array = new JSONArray();<br/>
							<span style="margin-right:24px;"></span>try {<br/>
								<span style="margin-right:48px;"></span>ResultSet rs = this.select(sql, rows);<br/>
								<span style="margin-right:48px;"></span>array = this.resultSetToJsonArray(rs);<br/>
							<span style="margin-right:24px;"></span>} catch (Exception e) {<br/>
								<span style="margin-right:48px;"></span>e.printStackTrace();<br/>
							<span style="margin-right:24px;"></span>}<br/>
							<span style="margin-right:24px;"></span>return array;<br/>
						}
						<p>&nbsp;</p>
						public ResultSet select(String sql, Integer rows){<br/>
							<span style="margin-right:24px;"></span>Connection conn = this.getConnection();<br/>
							<span style="margin-right:24px;"></span>ResultSet rs = null;<br/>
							<span style="margin-right:24px;"></span>try {<br/>
								<span style="margin-right:48px;"></span>Statement st = conn.createStatement();<br/>
								<span style="margin-right:48px;"></span>if(rows!=null){<br/>
									<span style="margin-right:72px;"></span>sql += " limit 0,"+rows;<br/>
								<span style="margin-right:48px;"></span>}<br/>
								<span style="margin-right:48px;"></span>rs = st.executeQuery(sql);<br/>
							<span style="margin-right:24px;"></span>} catch (SQLException e) {<br/>
								<span style="margin-right:48px;"></span>e.printStackTrace();<br/>
							<span style="margin-right:24px;"></span>}<br/>
							<span style="margin-right:24px;"></span>return rs;<br/>
						}
						<p>&nbsp;</p>
						private JSONArray resultSetToJsonArray(ResultSet rs){<br/>
							<span style="margin-right:24px;"></span>JSONArray array = new JSONArray();<br/>
							<span style="margin-right:24px;"></span>try {<br/>
								<span style="margin-right:48px;"></span>ResultSetMetaData metaData = rs.getMetaData();<br/>
								<span style="margin-right:48px;"></span>int columnCount = metaData.getColumnCount();<br/>
								
								<span style="margin-right:48px;"></span>Map<String, Integer> keyMap = new LinkedHashMap<String, Integer>();<br/>
								<span style="margin-right:48px;"></span>for(int i=0; i&lt;columnCount; i++){<br/>
									<span style="margin-right:72px;"></span>keyMap.put(metaData.getColumnName(i+1), metaData.getColumnType(i+1));<br/>
								<span style="margin-right:48px;"></span>}<br/>
								<span style="margin-right:48px;"></span>int i = 0;<br/>
								<span style="margin-right:48px;"></span>while (rs.next()) {<br/>
									<span style="margin-right:72px;"></span>JSONObject json = new JSONObject();<br/>
									<span style="margin-right:72px;"></span>for(String key : keyMap.keySet()){<br/>
										<span style="margin-right:96px;"></span>switch (keyMap.get(key)) {<br/>
											<span style="margin-right:120px;"></span>case Types.INTEGER:<br/>
												<span style="margin-right:144px;"></span>String val = rs.getString(key);<br/>
												<span style="margin-right:144px;"></span>json.put(key, StringUtils.isEmpty(val)?"":Integer.valueOf(val));<br/>
												<span style="margin-right:144px;"></span>break;<br/>
											<span style="margin-right:120px;"></span>case Types.BIGINT:<br/>
												<span style="margin-right:144px;"></span>json.put(key, rs.getLong(key));<br/>
												<span style="margin-right:144px;"></span>break;<br/>
											<span style="margin-right:120px;"></span>case Types.DOUBLE:<br/>
												<span style="margin-right:144px;"></span>json.put(key, rs.getDouble(key));<br/>
												<span style="margin-right:144px;"></span>break;<br/>
											<span style="margin-right:120px;"></span>default:<br/>
												<span style="margin-right:144px;"></span>json.put(key, rs.getString(key));<br/>
												<span style="margin-right:144px;"></span>break;<br/>
										<span style="margin-right:96px;"></span>}<br/>
									<span style="margin-right:72px;"></span>}<br/>
									<span style="margin-right:72px;"></span>array.put(i, json);<br/>
									<span style="margin-right:72px;"></span>i++;<br/>
								<span style="margin-right:48px;"></span>}<br/>
							<span style="margin-right:24px;"></span>} catch (Exception e) {<br/>
							<span style="margin-right:24px;"></span>}<br/>
							<span style="margin-right:24px;"></span>return array;<br/>
						}
					</div>
				</div>
				
				<div class="item">
					<div style="padding-top:10px;padding-bottom:10px;"><b>5.1 DBUtil.search()</b></div>
					<div class="code" style="font-size:14px;height:600px;overflow:auto;line-height:24px;">
						public void search(Page page, String sql){<br/>
							<span style="margin-right:24px;"></span>Connection conn = this.getConnection();<br/>
							<span style="margin-right:24px;"></span>ResultSet rs = null;<br/>
							<span style="margin-right:24px;"></span>try {<br/>
								<span style="margin-right:48px;"></span>Statement st = conn.createStatement();<br/>
								<span style="margin-right:48px;"></span>rs = st.executeQuery(sql + " limit " + ((page.getPageNo()-1)*page.getPageSize()) + ", " + page.getPageSize());<br/>
								<span style="margin-right:48px;"></span>page.setData(this.resultSetToJsonArray(rs));<br/>
								
								<span style="margin-right:48px;"></span>String countSql = sql.substring(sql.indexOf("from"));<br/>
								<span style="margin-right:48px;"></span>if(StringUtils.isEmpty(countSql)){<br/>
									<span style="margin-right:72px;"></span>countSql = sql.substring(sql.indexOf("FROM"));<br/>
								<span style="margin-right:48px;"></span>}
								<span style="margin-right:48px;"></span>countSql = "select count(1) " + countSql;<br/>
								<span style="margin-right:48px;"></span>st = conn.createStatement();<br/>
								<span style="margin-right:48px;"></span>rs = st.executeQuery(countSql);<br/>
								<span style="margin-right:48px;"></span>rs.next();<br/>
								<span style="margin-right:48px;"></span>page.setTotalRows(rs.getInt(1));<br/>
							<span style="margin-right:24px;"></span>} catch (SQLException e) {<br/>
								e.printStackTrace();<br/>
							<span style="margin-right:24px;"></span>}<br/>
						}
						<p>&nbsp;</p>
							public class Page {<br/>
								<span style="margin-right:24px;"></span>private Integer pageNo;	<br/>
								<span style="margin-right:24px;"></span>private Integer pageSize;<br/>
								<span style="margin-right:24px;"></span>private Integer totalRows;<br/>
								<span style="margin-right:24px;"></span>private Integer totalPage;<br/>
								<span style="margin-right:24px;"></span>private JSONArray data;<br/>
								<span style="margin-right:24px;"></span>private JSONObject other;<br/>
								<span style="margin-right:24px;"></span>public Page(){<br/>
									<span style="margin-right:48px;"></span>this.pageNo = 1;<br/>
									<span style="margin-right:48px;"></span>this.pageSize = 20;<br/>
								<span style="margin-right:24px;"></span>}<br/>
								<span style="margin-right:24px;"></span>public Page(int pageNo, int pageSize){<br/>
									<span style="margin-right:48px;"></span>this.pageNo = pageNo;<br/>
									<span style="margin-right:48px;"></span>this.pageSize = pageSize;<br/>
								<span style="margin-right:24px;"></span>}<br/>
								<span style="margin-right:24px;"></span>public String pageToJson(){<br/>
									<span style="margin-right:48px;"></span>JSONObject json = new JSONObject();<br/>
									<span style="margin-right:48px;"></span>json.put("pageNo", this.pageNo);<br/>
									<span style="margin-right:48px;"></span>json.put("pageSize", this.pageSize);<br/>
									<span style="margin-right:48px;"></span>json.put("totalRows", this.totalRows);<br/>
									<span style="margin-right:48px;"></span>json.put("totalPage", this.totalPage);<br/>
									<span style="margin-right:48px;"></span>json.put("data", this.data==null?"[]":this.data.toString());<br/>
									<span style="margin-right:48px;"></span>json.put("other", this.other);<br/>
									<span style="margin-right:48px;"></span>return json.toString();<br/>
								<span style="margin-right:24px;"></span>}<br/>
								<span style="margin-right:24px;"></span>public Integer getPageNo() {<br/>
									<span style="margin-right:48px;"></span>return pageNo;<br/>
								<span style="margin-right:24px;"></span>}<br/>
								<span style="margin-right:24px;"></span>public void setPageNo(Integer pageNo) {<br/>
									<span style="margin-right:48px;"></span>this.pageNo = pageNo;<br/>
								<span style="margin-right:24px;"></span>}<br/>
								<span style="margin-right:24px;"></span>public Integer getPageSize() {<br/>
									<span style="margin-right:48px;"></span>return pageSize==null?20:pageSize;<br/>
								<span style="margin-right:24px;"></span>}<br/>
								<span style="margin-right:24px;"></span>public void setPageSize(Integer pageSize) {<br/>
									<span style="margin-right:48px;"></span>this.pageSize = pageSize;<br/>
								<span style="margin-right:24px;"></span>}<br/>
								<span style="margin-right:24px;"></span>public Integer getTotalRows() {<br/>
									<span style="margin-right:48px;"></span>return totalRows;<br/>
								<span style="margin-right:24px;"></span>}<br/>
								<span style="margin-right:24px;"></span>public void setTotalRows(Integer totalRows) {<br/>
									<span style="margin-right:48px;"></span>this.totalRows = totalRows;<br/>
									<span style="margin-right:48px;"></span>if(totalRows%this.getPageSize()==0){<br/>
										<span style="margin-right:72px;"></span>this.totalPage = totalRows/this.getPageSize();<br/>
									<span style="margin-right:48px;"></span>}else{<br/>
										<span style="margin-right:72px;"></span>this.totalPage = totalRows/this.getPageSize() + 1;<br/>
									<span style="margin-right:48px;"></span>}<br/>
								<span style="margin-right:24px;"></span>}<br/>
								<span style="margin-right:24px;"></span>public Integer getTotalPage() {<br/>
									<span style="margin-right:48px;"></span>return totalPage;<br/>
								<span style="margin-right:24px;"></span>}<br/>
								<span style="margin-right:24px;"></span>public void setTotalPage(Integer totalPage) {<br/>
									<span style="margin-right:48px;"></span>this.totalPage = totalPage;<br/>
								<span style="margin-right:24px;"></span>}<br/>
								<span style="margin-right:24px;"></span>public JSONArray getData() {<br/>
									<span style="margin-right:48px;"></span>return data;<br/>
								<span style="margin-right:24px;"></span>}<br/>
								<span style="margin-right:24px;"></span>public void setData(JSONArray data) {<br/>
									<span style="margin-right:48px;"></span>this.data = data;<br/>
								<span style="margin-right:24px;"></span>}<br/>
								<span style="margin-right:24px;"></span>public JSONObject getOther() {<br/>
									<span style="margin-right:48px;"></span>return other;<br/>
								<span style="margin-right:24px;"></span>}<br/>
								<span style="margin-right:24px;"></span>public void setOther(JSONObject other) {<br/>
									<span style="margin-right:48px;"></span>this.other = other;<br/>
								<span style="margin-right:24px;"></span>}<br/>
							}
					</div>
				</div>
                
            </div>
            
        </div>
        
    </body>
</html>